package com.bitoon.basketdudes.web.admin;

import com.bitoon.basketdudes.web.BaseAction;
import javax.persistence.*;
import com.bitoon.basketdudes.web.datos.InfoCabeceraXHR;
import java.util.*;
import org.apache.log4j.Logger;

public class ListaTiendaAdmin extends BaseAction {

    private List<DatoTipoItemTienda> datos;        //resultados de la búsqueda
    private InfoCabeceraXHR cabecera;
    private int pagina = 1;
    private int cuantos;

    private String familia;
    private String orden;
    private String tipo;

    private Logger log = Logger.getLogger(ListaTiendaAdmin.class);

    //acceso a la clase estatica BaseActionAdmin
    protected BaseActionAdmin bsaadmin = BaseActionAdmin.getInstance();

    @Override
    public String execute() {
        String retorno = SUCCESS;

        log.debug("buscando familia de objetos tienda, familia: " + getFamilia());

        //si se pasa un parámetro
        if(getFamilia()!=null){
            if(cuantos==0){
                cuantos = BaseActionAdmin.LISTADO_TIENDA_ELEMENTOS_POR_PAGINA;
            }
            dameItems(cuantos,BaseActionAdmin.LISTADO_TIENDA_HUECOS_LADO_PAGINA);
        }

        return retorno;
    }

    public String dameItemsXHR(){
        String retorno = SUCCESS;

        dameItems(cuantos, BaseActionAdmin.LISTADO_TIENDA_HUECOS_LADO_PAGINA);

        return retorno;
    }

    public void dameItems(int elementos, int huecos){
        List<DatoTipoItemTienda> retorno = null;
        EntityManager em = null;

        try {
            log.debug("[dameItems] Entro a buscar items de la familia: "+familia);
            em = bsaadmin.getEmfAdmin().createEntityManager(); // checked

            Query q = null;

            String select_carta = "select c.id as id,m.nombre as nombre,c.descripcion as descripcion," +
                    "c.nivel as nivel,c.estado as estado,c.rareza as rareza,c.precio as precio,c.puntos as puntos,-1 as usos,-1 as dias"+
                    " from basket.carta c join basket.m_carta m on(c.m_carta_id = m.id) order by " + orden + " " + tipo;

            //sacamos la descripcion siempre que no sea un sobre
            String descripcion = "i.descripcion as descripcion,";
            String rareza = "i.rareza as rareza,";
            if(familia.compareTo("sobre")==0 || familia.compareTo("gashaball")==0){
                descripcion = "'' as descripcion,";
                rareza = "-1 as rareza,";
            }

            //sacamos los usos y dias siempre que sea ropa
            String usos = ",i.usos as usos";
            String dias = ",i.dias as dias";
            if(familia.compareTo("ropa")!=0){
                usos=",-1 as usos";
                dias=",-1 as dias";
            }

            String select_item = "select i.id as id,i.nombre as nombre,"+ descripcion +
                    "i.nivel as nivel,i.estado as estado," + rareza + "i.precio as precio,i.puntos as puntos"+ usos + dias +
                    " from basket." + familia + " i order by " + orden + " " + tipo;

            if(familia.compareTo("carta")==0){
                q = em.createNativeQuery(select_carta,DatoTipoItemTienda.class);
            }else{
                q = em.createNativeQuery(select_item,DatoTipoItemTienda.class);
            }

            log.debug("select: " + select_item);

            int totalRegistros = q.getResultList().size();
            int totalPaginas = (totalRegistros-1)/elementos + 1;

            int offset = (pagina-1) * elementos;
            int first = (pagina-1)*elementos; //primer registro
            int max = elementos; //ultimo registro

            if(familia.compareTo("carta")==0){
                q = em.createNativeQuery(select_carta,DatoTipoItemTienda.class);
            }else{
                q = em.createNativeQuery(select_item,DatoTipoItemTienda.class);
            }

            q.setFirstResult(first);
            q.setFirstResult(offset);
            q.setMaxResults(max);
            
            retorno = new ArrayList<DatoTipoItemTienda>();
            retorno = (List<DatoTipoItemTienda>)q.getResultList();

            log.debug("[dameItems]retorno: " + retorno.size());

            cabecera = new InfoCabeceraXHR();
            cabecera.setCorrecto(1);
            cabecera.setActual(pagina);
            cabecera.setTotal(totalPaginas);
            cabecera.setTotalRegistros(totalRegistros);

            int p1=0, p2=0;

            if (pagina <= (huecos+1)) {
                p1 = 1;
                p2 = huecos*2 + 1;
            } else if (pagina >= (totalPaginas-huecos)) {
                p1 = totalPaginas - (huecos*2);
                p2 = totalPaginas;
            } else {
                p1 = pagina - huecos;
                p2 = pagina + huecos;
            }
            if (p1 < 1) {
                p1 = 1;
            }
            if (p2 > totalPaginas) {
                p2 = totalPaginas;
            }
            cabecera.setPrimeraPagina(p1);
            cabecera.setUltimaPagina(p2);
            getCabecera().setTotalRegistros(totalRegistros);

            setDatos(retorno);
            setCabecera(cabecera);
        } catch (Exception e) {
            log.error("[dameItems] Error", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }
    }

    public String getFamilia() {
        return familia;
    }

    public void setFamilia(String familia) {
        this.familia = familia;
    }

    public List<DatoTipoItemTienda> getDatos() {
        return datos;
    }

    public void setDatos(List<DatoTipoItemTienda> datos) {
        this.datos = datos;
    }

    public InfoCabeceraXHR getCabecera() {
        return cabecera;
    }

    public void setCabecera(InfoCabeceraXHR cabecera) {
        this.cabecera = cabecera;
    }

    public int getPagina() {
        return pagina;
    }

    public void setPagina(int pagina) {
        this.pagina = pagina;
    }

    public int getCuantos() {
        return cuantos;
    }

    public void setCuantos(int cuantos) {
        this.cuantos = cuantos;
    }

    public String getOrden() {
        return orden;
    }

    public void setOrden(String orden) {
        this.orden = orden;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public BaseActionAdmin getBsaadmin() {
        return bsaadmin;
    }

    public void setBsaadmin(BaseActionAdmin bsaadmin) {
        this.bsaadmin = bsaadmin;
    }
}
